using Admin.Application.Common;
using Admin.Application.Dto;
using Admin.Application.Dto.Department;

namespace Admin.Application.Repositories;

/// <summary>
/// 部门服务接口，提供部门相关的业务逻辑操作。
/// </summary>
public interface IDepartmentService
{
    /// <summary>
    /// 添加一个新的部门。
    /// </summary>
    /// <param name="departmentDto">部门的数据传输对象，包含部门的基本信息，如部门名称、描述等。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含操作结果。
    /// - 成功时，返回包含成功消息的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<string>> AddDepartmentAsync(DepartmentInfoDto departmentDto);

    /// <summary>
    /// 删除一个部门。
    /// </summary>
    /// <param name="departmentId">要删除的部门的唯一标识符。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含操作结果。
    /// - 成功时，返回包含成功消息的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<string>> DeleteDepartmentAsync(Guid departmentId);

    /// <summary>
    /// 更新一个部门的信息。
    /// </summary>
    /// <param name="departmentId">要更新的部门的唯一标识符。</param>
    /// <param name="departmentDto">包含更新后部门信息的数据传输对象，如部门名称、描述等。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含操作结果。
    /// - 成功时，返回包含成功消息的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<string>> UpdateDepartmentInfoAsync(Guid departmentId, DepartmentInfoDto departmentDto);

    /// <summary>
    /// 获取分页的部门列表。
    /// </summary>
    /// <param name="pageIndex">分页的页码，从 1 开始。</param>
    /// <param name="pageSize">每页显示的部门数量。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含分页的部门列表。
    /// - 成功时，返回包含部门列表的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<List<ResDepartmentDto>>> GetPagedDepartmentAsync(int pageIndex, int pageSize);

    /// <summary>
    /// 根据部门 ID 获取部门的详细信息。
    /// </summary>
    /// <param name="departmentId">部门的唯一标识符。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含部门的详细信息。
    /// - 成功时，返回包含部门信息的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<ResDepartmentDto?>> GetDepartmentByIdAsync(Guid departmentId);

    /// <summary>
    /// 异步更新部门启用状态。
    /// </summary>
    /// <param name="departmentId">要更新的部门的ID。</param>
    /// <param name="activeDto">包含更新信息的启用状态数据传输对象，如是否启用。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含操作结果。
    /// - 成功时，返回包含成功消息的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<string>> UpdateIsActive(Guid departmentId, ActiveDto activeDto);

    /// <summary>
    /// 更新部门负责人的信息。
    /// </summary>
    /// <param name="departmentId">要更新的部门的唯一标识符。</param>
    /// <param name="managerID">新负责人的唯一标识符。如果为 <see langword="null"/>，表示清除当前负责人。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含操作结果。
    /// - 成功时，返回包含成功消息的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<string>> UpdateDepartmentManagerAsync(Guid departmentId, Guid? managerID);

    /// <summary>
    /// 更新部门的上级部门。
    /// </summary>
    /// <param name="departmentId">要更新的部门的唯一标识符。</param>
    /// <param name="parentId">上级部门的唯一标识符。如果为 <see langword="null"/>，表示该部门没有上级部门。</param>
    /// <returns>
    /// 返回一个 <see cref="Result{T}"/> 对象，其中包含操作结果。
    /// - 成功时，返回包含成功消息的 <see cref="Result{T}"/>。
    /// - 失败时，返回包含错误消息的 <see cref="Result{T}"/>。
    /// </returns>
    Task<Result<string>> UpdateDepartmentParentAsync(Guid departmentId, Guid? parentId);
}